home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 001-025 / scopedisk24 / qrt14src / bbox.c next >
C/C++ Source or Header  |  1995-03-18  |  4KB  |  196 lines

  1.  
  2. #include "qrt.h"
  3.  
  4. /**********************************************************
  5.  
  6.             Generates bounds for bounding box
  7.             v1 = min x,y,z; v2 = max x,y,z
  8.  
  9.  **********************************************************/
  10.  
  11. BboxBbox(v1,v2,bbox)
  12.   VECT_PTR v1,v2;
  13.   OBJ_PTR bbox;
  14. {
  15. # ifdef ROBUST
  16.     if (bbox->type!=BBOX) Error(INTERNAL_ERROR,101);
  17. # endif
  18.  
  19.   VectEQ(v1,&(bbox->lower));
  20.   VectEQ(v2,&(bbox->upper));
  21. }
  22.  
  23.  
  24. /**********************************************************
  25.  
  26.                Generates bounds for sphere
  27.                v1 = min x,y,z; v2 = max x,y,z
  28.  
  29.  **********************************************************/
  30.  
  31. BboxSphere(v1,v2,sphere)
  32.   VECT_PTR v1,v2;
  33.   OBJ_PTR sphere;
  34. {
  35. # ifdef ROBUST
  36.     if (!(sphere->type==SPHERE || sphere->type==LAMP))
  37.       Error(INTERNAL_ERROR,102);
  38. # endif
  39.  
  40.   v1->x=sphere->loc.x-sphere->vect1.x;
  41.   v2->x=sphere->loc.x+sphere->vect1.x;
  42.  
  43.   v1->y=sphere->loc.y-sphere->vect1.x;
  44.   v2->y=sphere->loc.y+sphere->vect1.x;
  45.  
  46.   v1->z=sphere->loc.z-sphere->vect1.x;
  47.   v2->z=sphere->loc.z+sphere->vect1.x;
  48.  
  49. }
  50.  
  51.  
  52. /**********************************************************
  53.  
  54.                Generates bounds for parallelogram
  55.                v1 = min x,y,z; v2 = max x,y,z
  56.  
  57.  **********************************************************/
  58.  
  59. BboxParallelogram(v1,v2,para)
  60.   VECT_PTR v1,v2;
  61.   OBJ_PTR para;
  62. {
  63.   VECTOR point2,point3,point4;
  64.  
  65. # ifdef ROBUST
  66.     if (para->type!=PARALLELOGRAM) Error(INTERNAL_ERROR,103);
  67. # endif
  68.  
  69.   VectorAdd(&point2,&(para->loc),&(para->vect1));
  70.   VectorAdd(&point3,&(para->loc),&(para->vect2));
  71.   VectorAdd(&point4,&point3,&(para->vect1));
  72.  
  73.   v1->x=MIN(point2.x,point3.x);
  74.   v1->x=MIN(v1->x,point4.x);
  75.   v1->x=MIN(v1->x,para->loc.x);
  76.  
  77.   v1->y=MIN(point2.y,point3.y);
  78.   v1->y=MIN(v1->y,point4.y);
  79.   v1->y=MIN(v1->y,para->loc.y);
  80.  
  81.   v1->z=MIN(point2.z,point3.z);
  82.   v1->z=MIN(v1->z,point4.z);
  83.   v1->z=MIN(v1->z,para->loc.z);
  84.  
  85.   v2->x=MAX(point2.x,point3.x);
  86.   v2->x=MAX(v2->x,point4.x);
  87.   v2->x=MAX(v2->x,para->loc.x);
  88.  
  89.   v2->y=MAX(point2.y,point3.y);
  90.   v2->y=MAX(v2->y,point4.y);
  91.   v2->y=MAX(v2->y,para->loc.y);
  92.  
  93.   v2->z=MAX(point2.z,point3.z);
  94.   v2->z=MAX(v2->z,point4.z);
  95.   v2->z=MAX(v2->z,para->loc.z);
  96.  
  97. }
  98.  
  99.  
  100. /**********************************************************
  101.  
  102.                Generates bounds for Triangle
  103.                v1 = min x,y,z; v2 = max x,y,z
  104.  
  105.  **********************************************************/
  106.  
  107. BboxTriangle(v1,v2,obj)
  108.   VECT_PTR v1,v2;
  109.   OBJ_PTR obj;
  110. {
  111.   VECTOR point2,point3;
  112.  
  113. # ifdef ROBUST
  114.     if (obj->type!=TRIANGLE) Error(INTERNAL_ERROR,104);
  115. # endif
  116.  
  117.   VectorAdd(&point2,&(obj->loc),&(obj->vect1));
  118.   VectorAdd(&point3,&(obj->loc),&(obj->vect2));
  119.  
  120.   v1->x=MIN(point2.x,point3.x);
  121.   v1->x=MIN(v1->x,obj->loc.x);
  122.  
  123.   v1->y=MIN(point2.y,point3.y);
  124.   v1->y=MIN(v1->y,obj->loc.y);
  125.  
  126.   v1->z=MIN(point2.z,point3.z);
  127.   v1->z=MIN(v1->z,obj->loc.z);
  128.  
  129.   v2->x=MAX(point2.x,point3.x);
  130.   v2->x=MAX(v2->x,obj->loc.x);
  131.  
  132.   v2->y=MAX(point2.y,point3.y);
  133.   v2->y=MAX(v2->y,obj->loc.y);
  134.  
  135.   v2->z=MAX(point2.z,point3.z);
  136.   v2->z=MAX(v2->z,obj->loc.z);
  137.  
  138. }
  139.  
  140. /**********************************************************
  141.  
  142.   Generates bounds for ring. This routine is not quite
  143.   right, and will generate a bounding box bigger than is
  144.   really needed, but it will have to do until i have time
  145.   to do it right.
  146.  
  147.                v1 = min x,y,z; v2 = max x,y,z
  148.  
  149.  **********************************************************/
  150.  
  151. BboxRing(v1,v2,ring)
  152.   VECT_PTR v1,v2;
  153.   OBJ_PTR ring;
  154. {
  155.  
  156. # ifdef ROBUST
  157.     if (ring->type!=RING) Error(INTERNAL_ERROR,105);
  158. # endif
  159.  
  160.   v1->x = ring->loc.x-ring->vect3.y;
  161.   v2->x = ring->loc.x+ring->vect3.y;
  162.  
  163.   v1->y = ring->loc.y-ring->vect3.y;
  164.   v2->y = ring->loc.y+ring->vect3.y;
  165.  
  166.   v1->z = ring->loc.z-ring->vect3.y;
  167.   v2->z = ring->loc.z+ring->vect3.y;
  168. }
  169.  
  170. /**********************************************************
  171.  
  172.                Generates bounds for Quadratic
  173.                v1 = min x,y,z; v2 = max x,y,z
  174.  
  175.      *** THIS IS NOT RIGHT FOR ROTATED QUADRATICS ***
  176.  
  177.  **********************************************************/
  178.  
  179. BboxQuadratic(v1,v2,quad)
  180.   VECT_PTR v1,v2;
  181.   OBJ_PTR quad;
  182. {
  183.  
  184. # ifdef ROBUST
  185.     if (quad->type!=QUADRATIC) Error(INTERNAL_ERROR,106);
  186. # endif
  187.  
  188.   VectEQ(v1,&(quad->lower));
  189.   VectEQ(v2,&(quad->upper));
  190.  
  191.   VectorAdd(v1,v1,&(quad->loc));
  192.   VectorAdd(v2,v2,&(quad->loc));
  193. }
  194.  
  195.  
  196.